package network.server.handler.StoreHandler;

import module.StoreService.CartItemService;
import module.StoreService.Impl.CartItemServiceImpl;
import network.protocol.Request;
import network.protocol.Response;
import network.server.RequestHandler;

import java.util.Map;

/**
 * {@code CartItemHandler} 是购物车项相关请求的处理器，实现了 {@link RequestHandler} 接口。
 * <p>
 * 主要功能：
 * <ul>
 *     <li>接收客户端请求并解析 action</li>
 *     <li>根据请求的操作类型调用 {@link CartItemService} 对应方法</li>
 *     <li>返回统一封装的 {@link Response} 结果</li>
 * </ul>
 * <p>
 * 支持的操作：
 * <ul>
 *     <li>{@code getCartItems} - 获取购物车所有商品项</li>
 *     <li>{@code getCartItem} - 获取指定购物车项</li>
 *     <li>{@code addToCart} - 添加商品到购物车</li>
 *     <li>{@code updateQuantity} - 更新购物车项数量</li>
 *     <li>{@code removeFromCart} - 移除购物车中的商品</li>
 *     <li>{@code getItemCount} - 获取购物车商品总数</li>
 *     <li>{@code getTotalAmount} - 获取购物车总金额</li>
 * </ul>
 */
public class CartItemHandler implements RequestHandler {
    private final CartItemService cartItemService;

    /**
     * 构造函数，初始化时使用 {@link CartItemServiceImpl#getInstance()} 获取单例服务对象。
     */
    public CartItemHandler() {
        this.cartItemService = CartItemServiceImpl.getInstance();
    }

    /**
     * 处理来自客户端的请求，根据 {@code action} 调用对应的处理方法。
     *
     * @param req 客户端请求，包含 action 和参数
     * @return 统一的响应对象，包含执行结果或错误信息
     */
    @Override
    public Response<?> handle(Request req) {
        String action = req.getAction();
        String methodName = action.substring(action.indexOf('.') + 1);
        Map<String, Object> params = req.getParams();

        try {
            switch (methodName) {
                case "getCartItems":
                    return handleGetCartItems(params);
                case "getCartItem":
                    return handleGetCartItem(params);
                case "addToCart":
                    return handleAddToCart(params);
                case "updateQuantity":
                    return handleUpdateQuantity(params);
                case "removeFromCart":
                    return handleRemoveFromCart(params);
                case "getItemCount":
                    return handleGetItemCount(params);
                case "getTotalAmount":
                    return handleGetTotalAmount(params);
                default:
                    return Response.error("未知操作: " + methodName);
            }
        } catch (Exception e) {
            return Response.error("处理请求时发生错误: " + e.getMessage());
        }
    }

    /**
     * 处理获取购物车所有商品的请求。
     *
     * @param params 请求参数，必须包含 {@code cartId}
     * @return 购物车商品列表或错误响应
     */
    private Response<?> handleGetCartItems(Map<String, Object> params) {
        Object cartIdObj = params.get("cartId");
        if (cartIdObj == null) {
            return Response.error("cartId参数不能为null");
        }
        long cartId = Long.parseLong(cartIdObj.toString());
        return cartItemService.getCartItemsByCartId(cartId);
    }

    /**
     * 处理获取特定购物车项的请求。
     *
     * @param params 请求参数，必须包含 {@code cartId} 和 {@code productId}
     * @return 指定的购物车项或错误响应
     */
    private Response<?> handleGetCartItem(Map<String, Object> params) {
        Object cartIdObj = params.get("cartId");
        if (cartIdObj == null) {
            return Response.error("cartId参数不能为null");
        }
        Object productIdObj = params.get("productId");
        if (productIdObj == null) {
            return Response.error("productId参数不能为null");
        }
        long cartId = Long.parseLong(cartIdObj.toString());
        long productId = Long.parseLong(productIdObj.toString());
        return cartItemService.getCartItemByCartAndProduct(cartId, productId);
    }

    /**
     * 处理添加商品到购物车的请求。
     *
     * @param params 请求参数，必须包含 {@code cartId}, {@code productId}, {@code quantity}
     * @return 添加结果，成功返回 {@code true}，否则返回错误信息
     */
    private Response<?> handleAddToCart(Map<String, Object> params) {
        Object cartIdObj = params.get("cartId");
        if (cartIdObj == null) {
            return Response.error("cartId参数不能为null");
        }
        Object productIdObj = params.get("productId");
        if (productIdObj == null) {
            return Response.error("productId参数不能为null");
        }
        Object quantityObj = params.get("quantity");
        if (quantityObj == null) {
            return Response.error("quantity参数不能为null");
        }
        long cartId = Long.parseLong(cartIdObj.toString());
        long productId = Long.parseLong(productIdObj.toString());
        int quantity = Integer.parseInt(quantityObj.toString());
        return cartItemService.addToCart(cartId, productId, quantity);
    }

    /**
     * 处理更新购物车项数量的请求。
     *
     * @param params 请求参数，必须包含 {@code cartItemId} 和 {@code quantity}
     * @return 更新结果，成功返回 {@code true}，否则返回错误信息
     */
    private Response<?> handleUpdateQuantity(Map<String, Object> params) {
        Object cartItemIdObj = params.get("cartItemId");
        if (cartItemIdObj == null) {
            return Response.error("cartItemId参数不能为null");
        }
        Object quantityObj = params.get("quantity");
        if (quantityObj == null) {
            return Response.error("quantity参数不能为null");
        }
        long cartItemId = Long.parseLong(cartItemIdObj.toString());
        int quantity = Integer.parseInt(quantityObj.toString());
        return cartItemService.updateCartItemQuantity(cartItemId, quantity);
    }

    /**
     * 处理移除购物车项的请求。
     *
     * @param params 请求参数，必须包含 {@code cartItemId}
     * @return 移除结果，成功返回 {@code true}，否则返回错误信息
     */
    private Response<?> handleRemoveFromCart(Map<String, Object> params) {
        Object cartItemIdObj = params.get("cartItemId");
        if (cartItemIdObj == null) {
            return Response.error("cartItemId参数不能为null");
        }
        long cartItemId = Long.parseLong(cartItemIdObj.toString());
        return cartItemService.removeFromCart(cartItemId);
    }

    /**
     * 处理获取购物车商品总数的请求。
     *
     * @param params 请求参数，必须包含 {@code cartId}
     * @return 商品数量，或错误响应
     */
    private Response<?> handleGetItemCount(Map<String, Object> params) {
        Object cartIdObj = params.get("cartId");
        if (cartIdObj == null) {
            return Response.error("cartId参数不能为null");
        }
        long cartId = Long.parseLong(cartIdObj.toString());
        return cartItemService.getCartItemCount(cartId);
    }

    /**
     * 处理获取购物车总金额的请求。
     *
     * @param params 请求参数，必须包含 {@code cartId}
     * @return 总金额，或错误响应
     */
    private Response<?> handleGetTotalAmount(Map<String, Object> params) {
        Object cartIdObj = params.get("cartId");
        if (cartIdObj == null) {
            return Response.error("cartId参数不能为null");
        }
        long cartId = Long.parseLong(cartIdObj.toString());
        return cartItemService.getCartTotalAmount(cartId);
    }
}
